package com.mdlaser.sys.controller;


import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.StpUtil;
import com.mdlaser.annotation.CommonRest;
import com.mdlaser.api.ResponseResult;
import com.mdlaser.enums.DeviceType;
import com.mdlaser.sys.dto.LoginDto;
import com.mdlaser.sys.entity.User;
import com.mdlaser.sys.service.IUserService;
import com.mdlaser.util.UserUtil;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author zn
 * @since 2024-04-04
 */
@RestController
@RequestMapping("/")
@CommonRest
@Tag(name = "登录管理")
public class LoginController {

    @Autowired
    IUserService userService;

    @Operation(summary = "登录")
    @SaIgnore
    @PostMapping("/login")
    public ResponseResult<Object> login(@RequestBody LoginDto loginDto) {
        String userId = userService.login(loginDto);
        StpUtil.login(userId, new SaLoginModel()
                .setDevice(DeviceType.PC)                // 此次登录的客户端设备类型, 用于[同端互斥登录]时指定此次登录的设备类型
                .setIsLastingCookie(true)        // 是否为持久Cookie（临时Cookie在浏览器关闭时会自动删除，持久Cookie在重新打开后依然存在）
                .setTimeout(60 * 60 * 24 * 7)    // 指定此次登录token的有效期, 单位:秒 （如未指定，自动取全局配置的 timeout 值）
                .setIsWriteHeader(true)         // 是否在登录后将 Token 写入到响应头
        );
        return ResponseResult.success("登陆成功", null);
    }

    @Operation(summary = "获取当前用户")
    @PostMapping("/currentUser")
    public Object getCurrentUser() {
        return UserUtil.getCurrentUser();
    }

    @Operation(summary = "登出")
    @SaIgnore
    @PostMapping("/logOut")
    public void logOut() {
        StpUtil.logout();
    }

}
